/**
 * @author junier
 */
package br.com.cept.sce.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import br.com.cept.sce.commons.factory.Factory;
import br.com.cept.sce.commons.security.Criptografia;
import br.com.cept.sce.commons.util.MessagesUtil;
import br.com.cept.sce.commons.util.NavigationOutcomes;
import br.com.cept.sce.commons.util.Servico;
import br.com.cept.sce.dominio.IPerfil;
import br.com.cept.sce.dominio.IUsuario;
import br.com.cept.sce.exception.manterUsuario.UsuarioBloqeueadoException;
import br.com.cept.sce.exception.manterUsuario.UsuarioInexistenteException;
import br.com.cept.sce.facade.ManterUsuarioFacade;

/**
 * @author Junier Amorim
 *
 */
public class UsuarioBean {
	
	private IUsuario usuario;
	
	private ManterUsuarioFacade facade;
	
	private List<IUsuario> usuarios;
	
	private List<SelectItem> perfis;
	
	private String selectedPerfil;
	
	private String idPessoa;
	
	/**
	 * @return the idPessoa
	 */
	public String getIdPessoa() {
		return idPessoa;
	}


	/**
	 * @param idPessoa the idPessoa to set
	 */
	public void setIdPessoa(String idPessoa) {
		this.idPessoa = idPessoa;
	}


	public List<SelectItem> getPerfis() {
		perfis = new ArrayList<SelectItem>();
		try{
			List<IPerfil> lista = getFacade().listarPerfis();
			for(IPerfil p : lista)
				perfis.add(new SelectItem(p.getId().toString(), p.getNome()));
		}catch(Exception erro){
			erro.printStackTrace();
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
		}
		return perfis;
	}


	public void setPerfis(List<SelectItem> perfis) {
		this.perfis = perfis;
	}


	public String getSelectedPerfil() {
		return selectedPerfil;
	}


	public void setSelectedPerfil(String selectedPerfil) {
		this.selectedPerfil = selectedPerfil;
	}


	public List<IUsuario> getUsuarios() {
		if(usuarios == null)
			try{
				usuarios = getFacade().listarUsuarios();
			}catch(Exception erro){
				erro.printStackTrace();
				Servico.getInstance().adicionarMensagemErro(erro.getMessage());
			}
		return usuarios;
	}


	public void setUsuarios(List<IUsuario> usuarios) {
		this.usuarios = usuarios;
	}


	/**
	 * @return the facade
	 */
	public ManterUsuarioFacade getFacade() {
		if(facade == null)
			facade = new ManterUsuarioFacade();
		return facade;
	}


	/**
	 * @param facade the facade to set
	 */
	public void setFacade(ManterUsuarioFacade facade) {
		this.facade = facade;
	}


	/**
	 * @return the usuario
	 */
	public IUsuario getUsuario() {
		if(usuario == null)
			usuario = Factory.getInstance().obterUsuario();
		return usuario;
	}


	/**
	 * @param usuario the usuario to set
	 */
	public void setUsuario(IUsuario usuario) {
		this.usuario = usuario;
	}


	public String efetuarLogin(){
		try{
			usuario.setSenha(Criptografia.getHashString(usuario.getSenha()));
 			IUsuario user = getFacade().autenticarUsuario(usuario);
 			if(user.getBloqueado())
 				throw new UsuarioBloqeueadoException(MessagesUtil.getMensagem("erro_bloqueado"));
			HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(true);
			BaseBean base = new BaseBean();
			if(user.getPerfil().getNome().equals("Administrador"))
				base.setPerfilAdministrador(true);
			else
				base.setPerfilOperador(true);
			session.setAttribute("base", base);
			session.setAttribute("usuario", user);
			setUsuario(null);
			return NavigationOutcomes.PRINCIPAL.toString();
		}catch(UsuarioBloqeueadoException erro){
			erro.printStackTrace();
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
			usuario = null;
			return null;
		}catch(UsuarioInexistenteException erro){
			erro.printStackTrace();
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
			usuario = null;
			return null;
		}catch(Exception erro){
			erro.printStackTrace();
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
			usuario = null;
			return null;
		}
	}
	
	
	public String cadastrar(){
		try{
			boolean flag = ((BaseBean)Servico.getInstance().recuperarObjetoSessao("base")).isFlag();
			if(!getUsuario().getSenha().equals(getUsuario().getSenha2()))
				throw new Exception(MessagesUtil.getMensagem("erro_conf_senhas"));
			if(!(getUsuario().getSenha().length() > 20)){
				getUsuario().setSenha(Criptografia.getHashString(getUsuario().getSenha()));
			}
			getUsuario().setSenha2(null);
			IPerfil perfil = Factory.getInstance().obterPerfil();
			perfil.setId(Long.parseLong(selectedPerfil));
			if(flag){
				getUsuario().setId(idPessoa);
				getFacade().atualizarUsuario(getUsuario(), perfil);
			}
			else
				getFacade().cadastrarUsuario(getUsuario(), perfil);
			setUsuario(null);
			((BaseBean)Servico.getInstance().recuperarObjetoSessao("base")).setFlag(false);
			Servico.getInstance().adicionarMensagemAviso(MessagesUtil.getMensagem("cadastro_usuario"));
		}catch(Exception erro){
			getUsuario().setSenha(null);
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
		}
		return null;
	}
	
	
	public String cancelar(){
		setUsuario(null);
		Servico.getInstance().excluirObjetoSessao("usuarioBean");
		return NavigationOutcomes.PRINCIPAL.toString();
	}
	
	
	public String editar() {    
		try{
			if((getUsuario() == null)||(getUsuario().getId() == null))
				throw new Exception(MessagesUtil.getMensagem("erro_necessario_selecionar"));
			setSelectedPerfil(getUsuario().getPerfil().getId().toString());
			getUsuario().setSenha2(getUsuario().getSenha());
			((BaseBean)Servico.getInstance().recuperarObjetoSessao("base")).setFlag(true);
			idPessoa = getUsuario().getId();
			return NavigationOutcomes.CADASTRAR_USUARIO.toString();
		}catch(Exception erro){
			getUsuario().setSenha(null);
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
		}
		return null;
	 }   
	
	
	public String excluir(){
		try{
			if((getUsuario() == null)||(getUsuario().getId() == null))
				throw new Exception(MessagesUtil.getMensagem("erro_necessario_selecionar"));
			
			return NavigationOutcomes.CADASTRAR_USUARIO.toString();
		}catch(Exception erro){
			getUsuario().setSenha(null);
			Servico.getInstance().adicionarMensagemErro(erro.getMessage());
		}
		return null;
	}
}
